Vectorización

base <- read.csv("../Bases de datos/auto-mpg.csv", stringsAsFactors = F)

Combinamos vectores

Se combinan dos vectores por medio de paste como si se hubiera hecho un ciclo.

first <- c("inicio 1 ", "inicio 2 ", "inicio 3 ", "inicio 4 ")
second <- c("primero", "segundo", "tercero", "cuarto")
paste(first, second)
## [1] "inicio 1  primero" "inicio 2  segundo" "inicio 3  tercero"
## [4] "inicio 4  cuarto"

La función paste permite combinar vectores de diferentes tamaños.

single <- c("prueba1", "prueba2")
paste(first, single)
## [1] "inicio 1  prueba1" "inicio 2  prueba2" "inicio 3  prueba1"
## [4] "inicio 4  prueba2"

Operaciones elementales sobre vectores

No es necesario definir ciclos para aplicar operaciones elementales a las columna de un data frame.

head(base[,1:5])
##   No mpg cylinders displacement horsepower
## 1  1  28         4          140         90
## 2  2  19         3           70         97
## 3  3  36         4          107         75
## 4  4  28         4           97         92
## 5  5  21         6          199         90
## 6  6  23         4          115         95
base$displacement <- base$displacement *4
head(base[,1:5])
##   No mpg cylinders displacement horsepower
## 1  1  28         4          560         90
## 2  2  19         3          280         97
## 3  3  36         4          428         75
## 4  4  28         4          388         92
## 5  5  21         6          796         90
## 6  6  23         4          460         95

La familia apply

La idea de las funciones que pertenecen a esta familia es la manipulación de vectores, matrices, listas y data frame. Permiten evitar el uso directo de ciclos por medio de funciones que operan directamente sobre cada elemento de la estructura de datos.

apply()

Esta función es aplicable sobre matrices, su estructura es apply(x, MARGIN, FUN, ...)y sus parámetros son los siguientes:

  • x <- Es la matriz
  • MARGIN <- Podemos realizar operaciones sobre filas o columnas donde 1 indica filas y 2 indica columnas.
  • FUN <- Es la función que se quiere aplicar sobre los datos, esta puede ser una función de agregación una de transformación o subconjunto o funciones vectorizadas.
Imagen tomada de DATACAMP

Imagen tomada de DATACAMP

Ejemplos

m <- matrix(seq(1,16), 4, 4)
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
#Máximo por columna
apply(m, 2, max)
## [1]  4  8 12 16
# Mínimo por filas
apply(m, 1, min)
## [1] 1 2 3 4

También podemos definir funciones dentro de la función apply y aplicar estas funciones tanto por filas como por columnas (c(1,2))

# Cuadrado de x
apply(m, c(1,2), function(x){x^2})
##      [,1] [,2] [,3] [,4]
## [1,]    1   25   81  169
## [2,]    4   36  100  196
## [3,]    9   49  121  225
## [4,]   16   64  144  256

Si queremos aplicar funciones que dependen de ciertos parámetros lo hacemos de la siguiente manera.

# Aplicando la función quantile

apply(m, 1, quantile,probs = c(0.4,0.6,0.8))
##     [,1] [,2] [,3] [,4]
## 40%  5.8  6.8  7.8  8.8
## 60%  8.2  9.2 10.2 11.2
## 80% 10.6 11.6 12.6 13.6

lapply()

Esta función permite trabajar con vectores, listas o data frame. Se pueden aplicar operaciones por elementos las cuales con retornadas como una lista. Su estructura está dada por lapply(x, simplify=FALSE, FUN,...).

  • simplify=FALSE <- Le indica a R que no retorne los valores como una lista.
Imagen tomada de DATACAMP

Imagen tomada de DATACAMP

Ejemplos

x <- 1:3
lapply(x, sqrt)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1.414214
## 
## [[3]]
## [1] 1.732051
x <- list(a = 1:10, b = c(1,10,100,1000), c = seq(5,50,5))
x
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $b
## [1]    1   10  100 1000
## 
## $c
##  [1]  5 10 15 20 25 30 35 40 45 50
lapply(x, mean)
## $a
## [1] 5.5
## 
## $b
## [1] 277.75
## 
## $c
## [1] 27.5

Sapply()

Esta función tiene un uso similar a la función lapply() ya que puede ser usada para data frame, vectores y listas pero se diferencia ya que esta imprime por consola un vector de valores y no una lista. La estructura está dada por sapply(x, FUN, ...)

Ejemplos

sapply(x, mean)
##      a      b      c 
##   5.50 277.75  27.50
sapply(base[,2:8], summary)
##              mpg cylinders displacement horsepower   weight acceleration
## Min.     9.00000  3.000000     272.0000    46.0000 1613.000      8.00000
## 1st Qu. 17.50000  4.000000     417.0000    76.0000 2223.750     13.82500
## Median  23.00000  4.000000     594.0000    92.0000 2803.500     15.50000
## Mean    23.51457  5.454774     773.7035   104.1281 2970.425     15.56809
## 3rd Qu. 29.00000  8.000000    1048.0000   125.0000 3608.000     17.17500
## Max.    46.60000  8.000000    1820.0000   230.0000 5140.000     24.80000
##         model_year
## Min.      70.00000
## 1st Qu.   73.00000
## Median    76.00000
## Mean      76.01005
## 3rd Qu.   79.00000
## Max.      82.00000
apply(base[,2:8], 2,sum)
##          mpg    cylinders displacement   horsepower       weight 
##       9358.8       2171.0     307934.0      41443.0    1182229.0 
## acceleration   model_year 
##       6196.1      30252.0

tapply()

Esta función permite aplicar funciones a subconjuntos de datos de un data data frame o vectores. Su estructura esta dado por tapply(X, INDEX, FUN , ..., simplify = TRUE).

  • INDEX <- Es una lista de las categorías.

Ejemplos

base$cylinders <- factor(base$cylinders,
                         levels = c(3,4,5,6,8),
                         labels = c("3C", "4C", "5C", "6C", "8C"))
#Función con respecto a cada nivel del número de cilindros

tapply(base$mpg, base$cylinders, mean)
##       3C       4C       5C       6C       8C 
## 20.55000 29.28676 27.36667 19.98571 14.96311
tapply(base$mpg, list(cyl = base$cylinders), mean)
## cyl
##       3C       4C       5C       6C       8C 
## 20.55000 29.28676 27.36667 19.98571 14.96311

by()

Esta función permite aplicar funciones definidas por el usuario a cualquier subconjunto de la base de datos. Su estructura es by(data, INDICES, FUN, ..., simplify = TRUE).

Ejemplo

by(base, base$cylinders, function(row){cor(row$mpg, row$acceleration)})
## base$cylinders: 3C
## [1] -0.8188727
## -------------------------------------------------------- 
## base$cylinders: 4C
## [1] 0.07488465
## -------------------------------------------------------- 
## base$cylinders: 5C
## [1] 0.714897
## -------------------------------------------------------- 
## base$cylinders: 6C
## [1] -0.339605
## -------------------------------------------------------- 
## base$cylinders: 8C
## [1] 0.3212278